﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Permissions;
using System.Collections;
using System.Linq;

using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using uacars;

namespace CADLibraryClass
{
    public class PedidosCAD
    {
        private static string cadenaConexion;

        public PedidosCAD()
        {
            cadenaConexion = Singleton.Instancia.Cadena;
        }


        public bool AltaPedido(int id, int vehiculo, int cliente, int empleado, int chofer, string tipotransaccion, string formadepago, float precio, float preciofinal, DateTime fecharealizado, DateTime fechafinalizado, string estadopedido, string facturado, string opcion1, string opcion2, string opcion3, string opcion4, string opcion5, string opcion6)
        {
            bool estadoOperacion = false;

            try
            {
                DataSet bdvirtual = new DataSet();

                SqlDataAdapter da = new SqlDataAdapter("select * from pedidos", cadenaConexion);
                da.Fill(bdvirtual, "pedidos");

                DataTable dt = new DataTable();
                dt = bdvirtual.Tables["pedidos"];

                DataRow nuevaFila = dt.NewRow();
                nuevaFila[0] = id;
                nuevaFila[1] = vehiculo;
                nuevaFila[2] = cliente;
                nuevaFila[3] = empleado;
                nuevaFila[4] = chofer;
                nuevaFila[5] = tipotransaccion;
                nuevaFila[6] = formadepago;
                nuevaFila[7] = precio;
                nuevaFila[8] = preciofinal;
                nuevaFila[9] = fecharealizado;
                nuevaFila[10] = fechafinalizado;
                nuevaFila[11] = estadopedido;
                nuevaFila[12] = facturado;

                nuevaFila[13] = opcion1;
                nuevaFila[14] = opcion2;
                nuevaFila[15] = opcion3;
                nuevaFila[16] = opcion4;
                nuevaFila[17] = opcion5;
                nuevaFila[18] = opcion6;
              
               

                dt.Rows.Add(nuevaFila);

                SqlCommandBuilder cBuilder = new SqlCommandBuilder(da);

                da.Update(bdvirtual, "pedidos");

                dt.AcceptChanges();
            }


            catch (SqlException sqlex)
            {
                throw new Exception("Error insertando pedido en uacarsBD: " + id, sqlex);
            }

            catch (Exception ex)
            {
                throw ex;
            }
            estadoOperacion = true;

            return (estadoOperacion);
        }

        public bool ModificarPedido(int id, int vehiculo, int cliente, int empleado, int chofer, string tipotransaccion, string formadepago, float precio, float preciofinal, DateTime fecharealizado, DateTime fechafinalizado, string estadopedido, string facturado, string opcion1, string opcion2, string opcion3, string opcion4, string opcion5, string opcion6)
        {
            bool estadoOperacion;
            try
            {
                DataSet bdvirtual = new DataSet();

                SqlDataAdapter da = new SqlDataAdapter("select * from pedidos", cadenaConexion);
                da.Fill(bdvirtual, "pedidos");

                DataTable dt = new DataTable();
                dt = bdvirtual.Tables["pedidos"];


                DataRow fila = dt.Select("id='" + id + "'")[0];
                fila["id"] = id;
                fila["vehiculo"] = vehiculo;
                fila["cliente"] = cliente;
                fila["empleado"] = empleado;
                fila["chofer"] = chofer;
                fila["tipotransaccion"] = tipotransaccion;
                fila["formadepago"] = formadepago;
                fila["precio"] = precio;
                fila["preciofinal"] = preciofinal;
                fila["fecharealizado"] = fecharealizado;
                fila["fechafinalizado"] = fechafinalizado;
                fila["estadopedido"] = estadopedido;
                fila["facturado"] = facturado;
                fila["opcion1"] = opcion1;
                fila["opcion2"] = opcion2;
                fila["opcion3"] = opcion3;
                fila["opcion4"] = opcion4;
                fila["opcion5"] = opcion5;
                fila["opcion6"] = opcion6;
              


                bdvirtual.Tables["pedidos"].LoadDataRow(fila.ItemArray, true);
                SqlCommandBuilder cBuilder = new SqlCommandBuilder(da);

                da.Update(bdvirtual, "pedidos");

                dt.AcceptChanges();
            }


            catch (SqlException sqlex)
            {
                throw new Exception("Error modificando pedido en uacarsBD: " + id, sqlex);
            }

            catch (Exception ex)
            {
                throw ex;
            }
            estadoOperacion = true;

            return (estadoOperacion);
        }

       
        public bool BorrarPedido(int id)
        {
            try
            {
                DataSet bdvirtual = new DataSet();

                SqlDataAdapter da = new SqlDataAdapter("select * from pedidos", cadenaConexion);
                da.Fill(bdvirtual, "pedidos");

                DataTable dt = new DataTable();
                dt = bdvirtual.Tables["pedidos"];

                DataRow[] filaBorrar;
                filaBorrar = dt.Select("id = " + id);               
                filaBorrar[0].Delete();

                SqlCommandBuilder cBuilder = new SqlCommandBuilder(da);

                da.Update(bdvirtual, "pedidos");

                dt.AcceptChanges();

            }

            catch (SqlException sqlex)
            {
                throw new Exception("Error borrando pedido en uacarsBD: " + id, sqlex);
            }

            catch (Exception ex)
            {
                throw ex;
            }
            return true;
        }



        public DataTable BuscarPedidos(ref DataTable todos, ref DataTable curso, ref DataTable fin)
        {
            

            DataSet bdvirtual = new DataSet();

            SqlDataAdapter da = new SqlDataAdapter("select * from pedidos", cadenaConexion);
            SqlDataAdapter da2 = new SqlDataAdapter("select * from pedidos WHERE estadopedido LIKE 'en curso'", cadenaConexion);
            SqlDataAdapter da3 = new SqlDataAdapter("select * from pedidos WHERE estadopedido LIKE 'finalizado'", cadenaConexion);


            da.Fill(bdvirtual, "pedidos");
            da2.Fill(bdvirtual, "pedidos2");
            da3.Fill(bdvirtual, "pedidos3");


            DataTable dt = new DataTable();
            dt = bdvirtual.Tables["pedidos"];
            todos = bdvirtual.Tables["pedidos"];

            curso = bdvirtual.Tables["pedidos2"];
            fin = bdvirtual.Tables["pedidos3"];

            return (dt);

        }

        public DataTable BuscarPedidos(int id, int vehiculo, int cliente, int empleado, int chofer, string tipotransaccion, string formadepago, float precio, float preciofinal, DateTime fecharealizado, DateTime fechafinalizado, string estadopedido, string opcion1, string opcion2, string opcion3, string opcion4, string opcion5, string opcion6, ref DataTable todos, ref DataTable curso, ref DataTable fin)
        {
            string filtro = "";

            if (id != 0) filtro += "id = " + id;
            if (vehiculo != 0) { if (filtro != "") filtro += " AND "; filtro += "vehiculo = " + vehiculo; }
            if (cliente != 0) { if (filtro != "") filtro += " AND "; filtro += "cliente = " + cliente; }
            if (empleado != 0) { if (filtro != "") filtro += " AND "; filtro += "empleado = " + empleado; }
            if (chofer != 0) { if (filtro != "") filtro += " AND "; filtro += "chofer = " + chofer; }
            if (tipotransaccion != null && tipotransaccion != "") { if (filtro != "") filtro += " AND "; filtro += "tipotransaccion LIKE '" + tipotransaccion + "'"; }
            if (formadepago != null && formadepago != "") { if (filtro != "") filtro += " AND "; filtro += "formadepago LIKE '" + formadepago + "'"; }
            if (precio != 0.0F) { if (filtro != "") filtro += " AND "; filtro += "precio = " + precio; }
            if (preciofinal != 0.0F) { if (filtro != "") filtro += " AND "; filtro += "preciofinal = " + preciofinal; }
            if (fecharealizado != DateTime.Parse("01/01/1900")) { if (filtro != "") filtro += " AND "; filtro += "fecharealizado = '" + fecharealizado.Date +"'"; }
            if (fechafinalizado != DateTime.Parse("01/01/1900")) { if (filtro != "") filtro += " AND "; filtro += "fechafinalizado = '" + fechafinalizado.Date +"'"; }
            if (estadopedido != null && estadopedido != "") { if (filtro != "") filtro += " AND "; filtro += "estadopedido LIKE '" + estadopedido + "'"; }
            if (opcion1 != null && opcion1 != "") { if (filtro != "") filtro += " AND "; filtro += "(opcion1 LIKE '" + opcion1 + "' OR opcion2 LIKE '" + opcion1 + "' OR opcion3 LIKE '" + opcion1 + "' OR opcion4 LIKE '" + opcion1 + "' OR opcion5 LIKE '" + opcion1 + "' OR opcion6 LIKE '" + opcion1 + "')"; }
            if (opcion2 != null && opcion2 != "") { if (filtro != "") filtro += " AND "; filtro += "(opcion1 LIKE '" + opcion2 + "' OR opcion2 LIKE '" + opcion2 + "' OR opcion3 LIKE '" + opcion2 + "' OR opcion4 LIKE '" + opcion2 + "' OR opcion5 LIKE '" + opcion2 + "' OR opcion6 LIKE '" + opcion2 + "')"; }
            if (opcion3 != null && opcion3 != "") { if (filtro != "") filtro += " AND "; filtro += "(opcion1 LIKE '" + opcion3 + "' OR opcion2 LIKE '" + opcion3 + "' OR opcion3 LIKE '" + opcion3 + "' OR opcion4 LIKE '" + opcion3 + "' OR opcion5 LIKE '" + opcion3 + "' OR opcion6 LIKE '" + opcion3 + "')"; }
            if (opcion4 != null && opcion4 != "") { if (filtro != "") filtro += " AND "; filtro += "(opcion1 LIKE '" + opcion4 + "' OR opcion2 LIKE '" + opcion4 + "' OR opcion3 LIKE '" + opcion4 + "' OR opcion4 LIKE '" + opcion4 + "' OR opcion5 LIKE '" + opcion4 + "' OR opcion6 LIKE '" + opcion4 + "')"; }
            if (opcion5 != null && opcion5 != "") { if (filtro != "") filtro += " AND "; filtro += "(opcion1 LIKE '" + opcion5 + "' OR opcion2 LIKE '" + opcion5 + "' OR opcion3 LIKE '" + opcion5 + "' OR opcion4 LIKE '" + opcion5 + "' OR opcion5 LIKE '" + opcion5 + "' OR opcion6 LIKE '" + opcion5 + "')"; }
            if (opcion6 != null && opcion6 != "") { if (filtro != "") filtro += " AND "; filtro += "(opcion1 LIKE '" + opcion6 + "' OR opcion2 LIKE '" + opcion6 + "' OR opcion3 LIKE '" + opcion6 + "' OR opcion4 LIKE '" + opcion6 + "' OR opcion5 LIKE '" + opcion6 + "' OR opcion6 LIKE '" + opcion6 + "')"; }

            string nombreTabla = "pedidos";
            DataSet ds = new DataSet();
            ds.Tables.Add(nombreTabla);
            SqlConnection conn = new SqlConnection(cadenaConexion);
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand co = new SqlCommand("", conn);
            SqlCommand co2 = new SqlCommand("", conn);
            SqlCommand co3 = new SqlCommand("", conn);

            if (filtro == "")
            {
                co.CommandText = "select * from " + nombreTabla;
                co2.CommandText = co.CommandText + " WHERE estadopedido LIKE 'en curso'";
                co3.CommandText = co.CommandText + " WHERE estadopedido LIKE 'finalizado'";
            }
            else
            {
                co.CommandText = "select * from " + nombreTabla + " WHERE " + filtro;
                co2.CommandText = co.CommandText + " AND estadopedido LIKE 'en curso'";
                co3.CommandText = co.CommandText + " AND estadopedido LIKE 'finalizado'";
            }

            


            da.SelectCommand = co;
            da.Fill(ds, nombreTabla);

            da.SelectCommand = co2;
            da.Fill(ds, "pedidos2");

            da.SelectCommand = co3;
            da.Fill(ds, "pedidos3");


            curso = ds.Tables["pedidos2"];
            fin = ds.Tables["pedidos3"];
            todos = ds.Tables["pedidos"];

            return ds.Tables[nombreTabla];
        }

        public bool EmisionFactura(int idfac, int idped)
        {
            bool estadoOperacion = false;

            try
            {
                DataSet bdvirtual = new DataSet();

                SqlDataAdapter da = new SqlDataAdapter("select * from factura", cadenaConexion);
                da.Fill(bdvirtual, "factura");
                SqlDataAdapter da2 = new SqlDataAdapter("select * from pedidos WHERE id = " + idped, cadenaConexion);
                da2.Fill(bdvirtual, "pedidos");

                DataTable dt = new DataTable();
                dt = bdvirtual.Tables["factura"];

                DataTable dt2 = new DataTable();
                dt2 = bdvirtual.Tables["pedidos"];

                DataRow fila = dt2.Select("id='" + idped + "'")[0];
                DataRow nuevaFila = dt.NewRow();
                nuevaFila[0] = idfac;
                nuevaFila[1] = idped;
                nuevaFila[2] = fila["vehiculo"];
                nuevaFila[3] = fila["cliente"];
                nuevaFila[4] = fila["empleado"];
                nuevaFila[5] = fila["chofer"];
                nuevaFila[6] = fila["tipotransaccion"];
                nuevaFila[7] = fila["formadepago"];
                nuevaFila[8] = fila["precio"];
                nuevaFila[9] = fila["preciofinal"];
                nuevaFila[10] = DateTime.Now;
                nuevaFila[11] = fila["opcion1"];
                nuevaFila[12] = fila["opcion2"];
                nuevaFila[13] = fila["opcion3"];
                nuevaFila[14] = fila["opcion4"];
                nuevaFila[15] = fila["opcion5"];
                nuevaFila[16] = fila["opcion6"];



                dt.Rows.Add(nuevaFila);

                SqlCommandBuilder cBuilder = new SqlCommandBuilder(da);

                da.Update(bdvirtual, "factura");

                dt.AcceptChanges();
            }


            catch (SqlException sqlex)
            {
                throw new Exception("Error insertando factura en uacarsBD: " + idfac, sqlex);
            }

            catch (Exception ex)
            {
                throw ex;
            }
            estadoOperacion = true;

            return (estadoOperacion);
        }


        public DataTable BuscarFactura(int idpedido)
        {


            DataSet bdvirtual = new DataSet();

            SqlDataAdapter da = new SqlDataAdapter("select * from factura WHERE pedido = " + idpedido, cadenaConexion);


            da.Fill(bdvirtual, "factura");
            


            DataTable dt = new DataTable();
            dt = bdvirtual.Tables["factura"];
            

            return (dt);

        }

        public float RecuperarPrecio(int idv, string tipov)
        {
            float precioV;

            DataSet bdvirtual = new DataSet();

            SqlDataAdapter da = new SqlDataAdapter("select * from vehiculos WHERE id=" + idv, cadenaConexion);
           
            da.Fill(bdvirtual, "vehiculos");
            


            DataTable dt = new DataTable();
            dt = bdvirtual.Tables["vehiculos"];

            if (tipov == "Venta")
            {
                precioV = float.Parse(dt.Rows[0]["precioventa"].ToString());
            }
            else
                precioV = float.Parse(dt.Rows[0]["precioalquiler"].ToString());
            return (precioV);

        
        }


        public DataTable VehiculoMasAlquilado()
        {
           

            string nombreTabla = "pedidos";
            DataSet ds = new DataSet();
            ds.Tables.Add(nombreTabla);
            SqlConnection conn = new SqlConnection(cadenaConexion);
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand co = new SqlCommand("", conn);
            co.CommandText = "select vehiculo, count(*) total from pedidos group by vehiculo having count(*) >= all (select count(*) from pedidos group by vehiculo);";
            da.SelectCommand = co;
            da.Fill(ds, nombreTabla);
            //todos = ds.Tables["pedidos"];

            return ds.Tables[nombreTabla];
        }


        public DataTable ClienteMasAlquila()
        {


            string nombreTabla = "pedidos";
            DataSet ds = new DataSet();
            ds.Tables.Add(nombreTabla);
            SqlConnection conn = new SqlConnection(cadenaConexion);
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand co = new SqlCommand("", conn);
            co.CommandText = "select cliente, count(*) total from pedidos group by cliente having count(*) >= all (select count(*) from pedidos group by cliente);";
            da.SelectCommand = co;
            da.Fill(ds, nombreTabla);
            //todos = ds.Tables["pedidos"];

            return ds.Tables[nombreTabla];
        }


        public DataTable EmpleadoMasAlquila()
        {


            string nombreTabla = "pedidos";
            DataSet ds = new DataSet();
            ds.Tables.Add(nombreTabla);
            SqlConnection conn = new SqlConnection(cadenaConexion);
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand co = new SqlCommand("", conn);
            co.CommandText = "select empleado, count(*) total from pedidos group by empleado having count(*) >= all (select count(*) from pedidos group by empleado);";
            da.SelectCommand = co;
            da.Fill(ds, nombreTabla);
            //todos = ds.Tables["pedidos"];

            return ds.Tables[nombreTabla];
        }

        public DataTable ModeloMasAlquilado()
        {


            string nombreTabla = "pedidos";
            string nombreTabla2 = "pedidos2";
            DataSet ds = new DataSet();
            ds.Tables.Add(nombreTabla);
            SqlConnection conn = new SqlConnection(cadenaConexion);
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand co = new SqlCommand("", conn);
            co.CommandText= "select vehiculo, count(*) total from pedidos group by vehiculo having count(*) >= all (select count(*) from pedidos group by vehiculo);";
            da.SelectCommand = co;
            da.Fill(ds, nombreTabla);
            DataTable tmp = ds.Tables[nombreTabla];
            string idWay = tmp.Rows[0][0].ToString();
            co.CommandText = "select marca,modelo from vehiculos where id='" + idWay + "'";
            da.SelectCommand = co;
            da.Fill(ds, nombreTabla2);
            return ds.Tables[nombreTabla2];
        }
    }


}


